lst-df-from-numpy 与 lst-series-align,创建 DataFrame 并观察标签对齐。loc/iloc 访问,以及观察 Series 标签自动对齐。Pandas建立在NumPy之上,提供了专为结构化数据处理设计的高级工具。
| 对比维度 | Pandas | Excel |
|---|---|---|
| 数据量 | 受内存与计算资源约束;可超过单工作表上限,但须按负载验证 | 单工作表最多 1,048,576 行 |
| 可重复性 | 代码可重现 | 操作难以追踪 |
| 自动化 | 可构建处理流程 | 需手动操作 |
| 复杂计算 | 分组、聚合、变换 | 功能有限 |
| 时间序列 | 专门优化 | 基础支持 |
选择边界:两者的可用规模都取决于任务、硬件和实现;先用代表性数据做内存与运行时间基准。
Pandas版本: 2.3.3
测试数据:
0 1
1 2
2 3
3 4
4 5
dtype: int64
Series是Pandas的一维数据结构,类似NumPy数组但带标签索引。
语法:pd.Series(data, index=index, dtype=dtype, name=name)
list_may、name、s 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。s 的结果;同时写出方向、数量级或表格/图形结构。运行后核对:核对 list_may、name、s 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。
拓展练习:把输入表替换为本地中国上市公司数据的同结构子集;指出必须保持的字段、数据类型和质量检查。
| 解析层 | 关键点 | 检查 |
|---|---|---|
| 输入 | list_may 是涨跌幅;name 是股票标签 |
两者长度一致 |
| 构造 | pd.Series(data, index=...) 建立一维带标签数组 |
左侧索引、右侧数值 |
| 用途 | 标签查找、自动对齐、日期索引 | 不把位置当标签 |
中国软件涨跌幅: -0.0338
第一个元素: -0.0035
前两个元素:
中国卫星 -0.0035
中国软件 -0.0338
Name: 涨跌幅, dtype: float64
负收益股票:
中国卫星 -0.0035
中国软件 -0.0338
上汽集团 -0.0298
Name: 涨跌幅, dtype: float64
统计摘要:
count 4.000000
mean -0.015325
std 0.019467
min -0.033800
25% -0.030800
50% -0.016650
75% -0.001175
max 0.005800
Name: 涨跌幅, dtype: float64
涨跌幅翻倍:
中国卫星 -0.0070
中国软件 -0.0676
中国银行 0.0116
上汽集团 -0.0596
Name: 涨跌幅, dtype: float64
按值排序(升序):
中国软件 -0.0338
上汽集团 -0.0298
中国卫星 -0.0035
中国银行 0.0058
Name: 涨跌幅, dtype: float64
按值排序(降序):
中国银行 0.0058
中国卫星 -0.0035
上汽集团 -0.0298
中国软件 -0.0338
Name: 涨跌幅, dtype: float64
| 访问方式 | 语法 | 说明 | 示例 |
|---|---|---|---|
| 标签索引 | s.loc['label'] |
使用索引名 | s.loc['中国卫星'] |
| 位置索引 | s.iloc[0] |
使用整数位置 | s.iloc[0] |
| 标签切片 | s.loc['a':'c'] |
包含两端 | s.loc['A':'C'] |
| 位置切片 | s.iloc[0:2] |
不包含末端 | s.iloc[0:2] |
易混淆点:标签切片包含末端,位置切片不包含;不要用 s[0] 猜测“整数标签还是位置”,Pandas 2.3 已提示此位置语义将改变。
DataFrame是Pandas的二维数据结构,类似Excel表格或SQL表。
语法:pd.DataFrame(data, index=index, columns=columns)
data、index、df 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。df 的结果;同时写出方向、数量级或表格/图形结构。# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务二:创建股票涨跌幅DataFrame
import pandas as pd
data={ # 定义data字典,开始构建键值映射
'中国卫星':[-0.0351,0.0172,-0.0035,-0.0246,0.0394], # "中国卫星"的数据序列
'中国软件':[-0.0139,0.0243,-0.0338,0.0146,0.0001], # "中国软件"的数据序列
'中国银行':[-0.0139,0.0243,-0.0338,0.0146,0.0001], # "中国银行"的数据序列
'上汽集团':[0.0212,0.0021,-0.0298,-0.0027,-0.0143] # "上汽集团"的数据序列
} # 数据结构定义结束
index=['20200525','20200526','20200527','20200528','20200529'] # 定义列表index
df=pd.DataFrame(data,index) # 创建数据框df
print(df) # 输出数据框数据运行后核对:核对 data、index、df 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。
拓展练习:把输入表替换为本地中国上市公司数据的同结构子集;指出必须保持的字段、数据类型和质量检查。
| 解析层 | 关键点 | 检查 |
|---|---|---|
| 输入 | data 的键成为列名;各列表长度一致 |
行列维度可核对 |
| 构造 | pd.DataFrame(data, index) 用交易日期作行标签 |
索引无重复 |
| 索引选择 | 时间分析用 DatetimeIndex;无业务标签才用 RangeIndex |
类型与排序正确 |
代码 名称 价格
0 600519.SH 贵州茅台 1850.0
1 000858.SZ 五粮液 220.5
2 600036.SH 招商银行 45.2
code name price
0 600519.SH 贵州茅台 1850.0
1 000858.SZ 五粮液 220.5
2 600036.SH 招商银行 45.2
A B C
row1 0.572031 0.164163 0.864984
row2 0.056765 0.773268 0.000643
row3 -1.161109 -0.817363 1.480771
row4 -0.292531 1.436584 -0.740262
row5 0.811554 0.342512 0.794984
data = {
'中国卫星': [-0.0351, 0.0172, -0.0035, -0.0246, 0.0394],
'中国软件': [-0.0139, 0.0243, -0.0338, 0.0146, 0.0001],
'中国银行': [-0.0139, 0.0243, -0.0338, 0.0146, 0.0001],
'上汽集团': [0.0212, 0.0021, -0.0298, -0.0027, -0.0143]
}
index = ['20200525', '20200526', '20200527', '20200528', '20200529']
df = pd.DataFrame(data, index=index)
# 方法1:点号访问(列名无空格时可用)
print('点号访问:')
print(df.中国卫星.head(3))
# 方法2:方括号访问(通用方法,推荐)
print('\n方括号访问:')
print(df['中国软件'].head(3))
# 方法3:同时访问多列
print('\n多列访问:')
print(df[['中国卫星', '中国软件']].head(3))点号访问:
20200525 -0.0351
20200526 0.0172
20200527 -0.0035
Name: 中国卫星, dtype: float64
方括号访问:
20200525 -0.0139
20200526 0.0243
20200527 -0.0338
Name: 中国软件, dtype: float64
多列访问:
中国卫星 中国软件
20200525 -0.0351 -0.0139
20200526 0.0172 0.0243
20200527 -0.0035 -0.0338
loc访问单行:
中国卫星 0.0172
中国软件 0.0243
中国银行 0.0243
上汽集团 0.0021
Name: 20200526, dtype: float64
loc访问多行:
中国卫星 中国软件 中国银行 上汽集团
20200526 0.0172 0.0243 0.0243 0.0021
20200527 -0.0035 -0.0338 -0.0338 -0.0298
iloc访问第1行:
中国卫星 -0.0351
中国软件 -0.0139
中国银行 -0.0139
上汽集团 0.0212
Name: 20200525, dtype: float64
iloc访问前2行:
中国卫星 中国软件 中国银行 上汽集团
20200525 -0.0351 -0.0139 -0.0139 0.0212
20200526 0.0172 0.0243 0.0243 0.0021
形状: (5, 4)
数据类型:
中国卫星 float64
中国软件 float64
中国银行 float64
上汽集团 float64
dtype: object
前3行:
中国卫星 中国软件 中国银行 上汽集团
20200525 -0.0351 -0.0139 -0.0139 0.0212
20200526 0.0172 0.0243 0.0243 0.0021
20200527 -0.0035 -0.0338 -0.0338 -0.0298
s1 = pd.Series([10, 20, 30], index=['a', 'b', 'c']) # 创建第一条带标签序列
s2 = pd.Series([5, 15, 25], index=['a', 'b', 'd']) # 创建第二条错位标签序列
print('Series 1:', s1.values, '索引:', list(s1.index)) # 输出第一条序列结构
print('Series 2:', s2.values, '索引:', list(s2.index)) # 输出第二条序列结构
aligned_sum = s1 + s2 # 按标签自动对齐并相加
print('\n加法(自动对齐):') # 输出结果标题
print(aligned_sum) # 显示错位标签产生的缺失Series 1: [10 20 30] 索引: ['a', 'b', 'c']
Series 2: [ 5 15 25] 索引: ['a', 'b', 'd']
加法(自动对齐):
a 15.0
b 35.0
c NaN
d NaN
dtype: float64
核心机制:只有相同索引的值才会运算,不同的产生 NaN;本章只诊断错位,不用填充值替代未知观测。
以下页面为第 11、13、16 章的路线图。课堂主路径可直接跳到“本章小结”;需要预习时再展开对应代码。
中国卫星 中国软件 中国银行 上汽集团
count 5.000000 5.000000 5.000000 5.000000
mean -0.001320 -0.001740 -0.001740 -0.004700
std 0.030368 0.023044 0.023044 0.018995
min -0.035100 -0.033800 -0.033800 -0.029800
25% -0.024600 -0.013900 -0.013900 -0.014300
50% -0.003500 0.000100 0.000100 -0.002700
75% 0.017200 0.014600 0.014600 0.002100
max 0.039400 0.024300 0.024300 0.021200
转置前形状: (5, 4)
转置后:
20200525 20200526 20200527 20200528 20200529
中国卫星 -0.0351 0.0172 -0.0035 -0.0246 0.0394
中国软件 -0.0139 0.0243 -0.0338 0.0146 0.0001
中国银行 -0.0139 0.0243 -0.0338 0.0146 0.0001
上汽集团 0.0212 0.0021 -0.0298 -0.0027 -0.0143
转置后形状: (4, 5)
中国卫星>0 且 中国软件>0:
中国卫星 中国软件 中国银行 上汽集团
20200526 0.0172 0.0243 0.0243 0.0021
20200529 0.0394 0.0001 0.0001 -0.0143
query方法筛选:
中国卫星 中国软件 中国银行 上汽集团
20200526 0.0172 0.0243 0.0243 0.0021
20200529 0.0394 0.0001 0.0001 -0.0143
DataFrame加法:
A B
0 11 44
1 22 55
2 33 66
DataFrame乘以标量10:
A B
0 10 40
1 20 50
2 30 60
data = {
'中国卫星': [-0.0351, 0.0172, -0.0035, -0.0246, 0.0394],
'中国软件': [-0.0139, 0.0243, -0.0338, 0.0146, 0.0001],
'中国银行': [-0.0139, 0.0243, -0.0338, 0.0146, 0.0001],
'上汽集团': [0.0212, 0.0021, -0.0298, -0.0027, -0.0143]
}
index = ['20200525', '20200526', '20200527', '20200528', '20200529']
df = pd.DataFrame(data, index=index)
# 每只股票的平均涨跌幅
print('均值(axis=0, 按列):')
print(df.mean())
# 每只股票的波动率
print('\n标准差:')
print(df.std())均值(axis=0, 按列):
中国卫星 -0.00132
中国软件 -0.00174
中国银行 -0.00174
上汽集团 -0.00470
dtype: float64
标准差:
中国卫星 0.030368
中国软件 0.023044
中国银行 0.023044
上汽集团 0.018995
dtype: float64
axis=0(默认):沿列方向计算 → 每只股票的统计值axis=1:沿行方向计算 → 每个交易日的统计值累积收益率(展示最后3个交易日,体现区间终值):
中国卫星 中国软件 中国银行 上汽集团
20200527 -0.0219 -0.0241 -0.0241 -0.0072
20200528 -0.0460 -0.0098 -0.0098 -0.0098
20200529 -0.0084 -0.0097 -0.0097 -0.0240
计算步骤:
1 + df:涨跌幅 → 收益率因子(如 -0.01 → 0.99).cumprod():计算累积乘积- 1:因子 → 累积收益率原始数据:
A B C
0 1.0 5.0 9
1 2.0 NaN 10
2 NaN NaN 11
3 4.0 8.0 12
缺失值位置(True=缺失):
A B C
0 False False False
1 False True False
2 True True False
3 False False False
用0填充:
A B C
0 1.0 5.0 9
1 2.0 0.0 10
2 0.0 0.0 11
3 4.0 8.0 12
前向填充:
A B C
0 1.0 5.0 9
1 2.0 5.0 10
2 2.0 5.0 11
3 4.0 8.0 12
用均值填充:
A B C
0 1.000000 5.0 9
1 2.000000 6.5 10
2 2.333333 6.5 11
3 4.000000 8.0 12
| 概念 | 说明 | 关键方法 |
|---|---|---|
| Series | 一维带标签数组 | pd.Series() |
| DataFrame | 二维表格数据 | pd.DataFrame() |
| 索引访问 | 标签/位置 | loc / iloc |
| 标签对齐 | 同名索引自动配对 | Series + Series |
| 扩展预览 | 筛选、统计、缺失值 | 第11、13、16章 |
lst-df-from-numpy 与 lst-series-align,创建 DataFrame 并观察标签对齐。import numpy as np # 导入数组计算库
import pandas as pd # 导入表格处理库
return_array=np.array([[0.01,0.02],[-0.02,0.03]]) # 准备无缺失二维收益数组
return_frame=pd.DataFrame(return_array,index=pd.to_datetime(['2026-01-05','2026-01-06']),columns=['A','B']) # 绑定日期与证券标签
left=pd.Series([1,2],index=['A','B']) # 创建左侧标签序列
right=pd.Series([10,20],index=['B','C']) # 创建错位标签序列
aligned=left+right # 观察标签自动对齐结果
assert return_frame.shape==(2,2) # 核对数组宽度与列标签数量一致
assert return_frame.index.is_unique # 核对日期索引唯一
print(return_frame.shape,list(return_frame.columns),aligned.to_dict()) # 输出核心创建与对齐依据解释与拓展应用答案:Pandas 增加业务标签和自动对齐,键错位会产生新缺失;拓展应用到长三角季度表时先核对索引唯一与字段宽度,缺失处理留到第16章。
所用数据与字段:Series=股票索引;DataFrame=交易日×股票
参考代码或推导(平台保护块之外):
[商业大数据分析与应用]